/**
 * aes加密
 * 详情参考：https://github.com/brix/crypto-js
 */

const CryptoJS = require("crypto-js");

/**
 * 加密构造函数
 */

var Cryp = {
    crypNew: function () {
        var cryp = {};
        var key = "";
        var iv = "";
        /**
         * 设置加密参数
         * @param {*} params 
         */
        cryp.setter = function (params = {}) {
            if (Object.keys(params).length == 0 || !params.key || !params.iv){
                throw "Failed to get encryption parameters Invalid parameter"
            }
            key = CryptoJS.enc.Utf8.parse(this.paramHandler(params.key));
            iv = CryptoJS.enc.Utf8.parse(this.paramHandler(params.iv));
        }

        // /**
        //  * 获取加密参数
        //  * @param {*} params 
        //  */
        cryp.getter = function(){
            return key
        }
        /**
         * 参数处理
         * 处理规则：奇偶数互换位置
         */
        cryp.paramHandler = function (key) {
            let charArray = key.split("");
            let rstArray = new Array(charArray.length);
            for (let i = 0; i < charArray.length; i += 2) {
                if (i + 1 <= charArray.length) {
                    rstArray[i] = charArray[i + 1];
                    rstArray[i + 1] = charArray[i];
                } else {
                    rstArray[i] = charArray[i];
                }
            }
            return rstArray.join("");
        };
        /**
         * 加密明文 返回 密文
         * @param context
         */
        cryp.encrypt = function (context) {
            let data = {
                iv: iv,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            }
            let encrypted = CryptoJS.AES.encrypt(String(context), key,data );
            // CryptoJS输出的Base64内容可能包含url参数不允许的 / % + 等， 因此要再进行一次针对 url 的 encode
            return encodeURIComponent(CryptoJS.enc.Base64.stringify(encrypted.ciphertext));
        }
        return cryp;
    }
}
 
export default Cryp.crypNew();



